package org.grc.app.z_project.z_framework.helper;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.grc.app.z_project.z_framework.util.ReflectionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
 * BeanHelper 就相当于一个“Bean容器”，因为在BeanMap中存放了Bean类和Bean实例的映射关系
 */

/**
 * bean 助手类
 * 
 * @author grc
 * @since 1.0-SNAPSHOT
 */
public final class BeanHelper {

	/**
	 * 定义Bean映射（用于存放Bean类与Bean实例的映射关系）
	 */
	private static Map<Class<?>, Object> BEAN_MAP = new HashMap<Class<?>, Object>();
	
	private static final Logger LOGGER = LoggerFactory.getLogger(BeanHelper.class);

	/*
 	 * 我们需要获所有被框架管理的Bean类，此时需要调用ClassHelper的getBeanClassSet方法，
 	 * 随用需要循环调用ReflectionUtil类的newInstance方法，根据类来实例化对象，
 	 * 最后将每次创建的对象存放在一个静态的Map<Class<?>, Object>中，
 	 * 我们需要随时获取该Map，还需要通过该Map的Key（类名）去获取对应的Value（Bean对象）。
 	 */
	static {
		Set<Class<?>> classSet = ClassHelper.getBeanClassSet();
		for (Class<?> clazz : classSet) {
			Object bean = ReflectionUtil.newInstance(clazz);
			BEAN_MAP.put(clazz, bean);
		}
//		LOGGER.info("Bean Map init success!");
	}
	
	/**
	 * 获取Bean映射
	 */
	public static Map<Class<?>, Object> getBeanMap () {
		return BEAN_MAP;
	}
	
	/**
	 * 获取Bean实例
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean (Class<T> clazz) {
		if (!BEAN_MAP.containsKey(clazz)) {
			throw new RuntimeException("can not get bean class: " + clazz);
		}
		return (T) BEAN_MAP.get(clazz);
	}
	
	/**
	 * 设置 Bean实例
	 */
	public static void setBean (Class<?> clazz, Object obj) {
		BEAN_MAP.put(clazz, obj);
	}
}
